<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>execute-go-bind-js-var</title>
    <script type="application/javascript">
        function clearMessage() {
            document.getElementById("message").innerHTML = "";
        }

        function writeMessage(data) {
            let message = document.getElementById("message");
            message.innerHTML = message.innerHTML + data + "<br>"
        }

        //通过根对象 goobj 和 gocobj 获取或设置值
        //goobj   是结构类型的根对象
        //gocobj  是通用类型的根对象

        /** 结构类型 */
        //获取Go中定义的绑定变量值
        function getGoBindVar() {
            clearMessage()
            writeMessage("结构")
            //------------------------
            //获取结构类型的字段值 string
            writeMessage("StringField: " + goobj.StructVarDemo.StringField)
            writeMessage("IntField: " + goobj.StructVarDemo.IntField)
            writeMessage("BoolField: " + goobj.StructVarDemo.BoolField)
            writeMessage("FloatField: " + goobj.StructVarDemo.FloatField)
            try {
                writeMessage("noExportField 是未导出的字段，将获取失败")
                writeMessage("noExportField: " + goobj.StructVarDemo.noExportField)
            } catch (e) {
                writeMessage("异常: " + e)
            }
        }

        //设置Go中定义的绑定变量值
        function setGoBindVar() {
            clearMessage()
            writeMessage("结构")
            //设置结构类型的字段值 string
            //注意: 结构类型的字段，设置不同类型的值将出现JS异常
            goobj.StructVarDemo.StringField = "在Web中改变后的值"
            goobj.StructVarDemo.IntField = 999999
            goobj.StructVarDemo.BoolField = true
            goobj.StructVarDemo.FloatField = 99999.9999
            try {
                writeMessage("StringField=int 不同的类型赋值将出现异常")
                //不同的类型赋值将出现异常
                goobj.StructVarDemo.StringField = 1001
            } catch (e) {
                writeMessage("异常: " + e)
            }
        }

        //调用Go中定义的函数
        function callGoBindFunc() {
            clearMessage()
            writeMessage("结构")
            //在JS中调用Go的函数
            //注意：同字段一样函数首字母只有大写才能调用
            //     入参类型必须符合Go中函数定义的参数类型, 否则调用失败, 注意的是参数个数有限制
            let ret = goobj.StructVarDemo.StringValue(' JS传的入参')
            writeMessage("调用函数 StringValue(param0 string) string: " + ret)
            goobj.StructVarDemo.FuncMaxParam('参数1', '参数2', '参数3', '参数4', '参数5', '参数6', '参数7', '参数8', '参数9')
            try {
                writeMessage("FuncMaxParam 函数和入参个数大于9个调用失败")
                //参数个数大于9个调用失败
                goobj.StructVarDemo.FuncMaxParam('参数1', '参数2', '参数3', '参数4', '参数5', '参数6', '参数7', '参数8', '参数9', '参数10')
            } catch (e) {
                writeMessage("异常: " + e)
            }
        }

        /** 普通类型 */
        //获取通用变量类型值
        function getGoBindCVar() {
            clearMessage()
            writeMessage("通用类型")
            writeMessage('JSString: ' + gocobj.JSString)
            writeMessage('JSInt: ' + gocobj.JSInt)
            writeMessage('JSBool: ' + gocobj.JSBool)
            writeMessage('JSDouble: ' + gocobj.JSDouble)
        }

        function setGoBindCVar() {
            clearMessage()
            writeMessage("通用类型")
            //通用类型可以任意修改变量存放的值类型
            gocobj.JSString = 'JS中改变了通用类型字符串值'
            writeMessage('JSString值改变: ' + gocobj.JSString)
            //改变为其它类型后，在Go中使用时需要判断类型，否则类型不一样无法正确取值
            gocobj.JSString = 99999
            writeMessage('JSString值变成了Int类型: ' + gocobj.JSString)
            //将其它变量值改变
            gocobj.JSInt = 999911
            gocobj.JSBool = true
            gocobj.JSDouble = 999999.999
        }

        function callGoBindCFunc() {
            clearMessage()
            writeMessage("通用类型")
            writeMessage('调用JSFunc函数: ' + gocobj.JSFunc('JS传入的参数'))
        }

        /** to json */
        function toJSON() {
            clearMessage()
            writeMessage("ToJSON")
            writeMessage('结构类型-JSON: ' + JSON.stringify(goobj))
            writeMessage('通用类型-JSON: ' + JSON.stringify(gocobj))
        }
    </script>
</head>
<body style="overflow: hidden;margin: 0px;padding: 0px;">
execute-go-bind-js-var:<br>
<div style="margin: 10px">
    结构类型：
    <button onclick="getGoBindVar()">获取Go中定义的绑定变量值</button>
    <button onclick="setGoBindVar()">设置Go中定义的绑定变量值</button>
    <button onclick="callGoBindFunc()">调用Go中定义的函数</button>
</div>
<div style="margin: 10px">
    通用类型：
    <button onclick="getGoBindCVar()">获取Go中定义的通用类型绑定变量值</button>
    <button onclick="setGoBindCVar()">设置Go中定义的通用类型绑定变量值</button>
    <button onclick="callGoBindCFunc()">调用Go中定义的函数</button>
</div>
<div style="margin: 10px">
    <button onclick="toJSON()">toJSON</button>
</div>
<div id="message"></div>
</body>
</html>